文件与目录（权限，操作，搜索）
==================================================

一：权限
---------------------------------------------------------------------------------------------
用户和权限管理：
    
    进程安全上下文：
        进程：运行一个程序文件而产生，通常由一个用户发起；进程则以发起者的身份运行；
        判断进程的发起者是否与文件属主相同，如果是，则以属主的身份来访问，从而应用属主权限；否则
        判断进程的发起者是否属于文件的属组，如果是，则应用属组权限；否则
        应用“其它”权限
        
        例外场景：factl, suid, sgid, sticky

    文件系统文件权限：
        三类用户：
            属主：owner, u
            属组：group, g
            其它：other, o
        权限：
            r: readable，可读
            w: writable, 可写
            x：excutable, 可执行 
    权限管理：
        文件：
            r：可获取文件的数据
            w：可修改文件的数据
            x：可将此文件运行为进程
        目录：
            r：可使用ls命令获取其下的所有文件列表；但不可以使用“ls -l”去获取详细信息，也不可以cd至此目录中
            w：可修改此目录下的文件列表， 即可以在此目录下创建或删除文件
            x：可以使用"ls -l“命令来获取其下的文件的详细属性信息，也可cd至此目录中
        rwxrwxrwx：
            owner: rwx 
            group: rwx 
            other: rwx 
        权限组合机制：
            以owner为例：
                        二进制     八进制
            ---         000         0   
            --x         001         1
            -w-         010         2
            -wx         011         3
            r--         100         4
            r-x         101         5
            rw-         110         6
            rwx         111         7
        例如：
                rwxr-xr-x：755
                rw-r--r--: 644

        ownership: 仅管理员有权限 
                改属主：chown
                改属组：chgrp
        mode(permission)：仅属主
                chmod                
---------------------------------------------------------------------------------------------
（*）chmod：改变文件模式位
SYNOPSIS：
       chmod [OPTION]... MODE[,MODE]... FILE...
       chmod [OPTION]... OCTAL-MODE FILE...
       chmod [OPTION]... --reference=RFILE FILE...      
OPTIONS：（用户的标识符：u,g,o,a）
        (1) chmod [OPTION]... MODE[,MODE]... FILE...
            MODE：
                赋权表示法：直接操作一类用户的所有权限位rwx；
                    u=
                    g=
                    o=
                    a=
                    
                    两类用户权限相同：ug=, go=
                    不同类的用户权限不同：u=,g=,o=
                    
                授权表示法：操作一类用户一位或多位权限；
                    u+, u-
                    g+, g-
                    o+, o-
                    a+, a-
                    
                    两类用户权限收授机制相同：ug+, ug-, ...
                    不同类的用户权限不同：u+,g+,o+

                        ~]# chmod u=rwx bash.sh
                        ~]# chmod u-x bash.sh

                (2) chmod [OPTION]... OCTAL-MODE FILE...
                        ~]# chmod 755 bash.sh

                (3) chmod [OPTION]... --reference=RFILE FILE...
                    --reference=RFILE：RFILE表示参考其权限模型；
                    ~]# chmod --reference reference.sh bash.sh

                 -R, --recursive：递归修改；
                    ~]# chmod -R 755 Public/
---------------------------------------------------------------------------------------------
（*）chown：更改文件所有者和组
SYNOPSIS
       chown [OPTION]... [OWNER][:[GROUP]] FILE...
       chown [OPTION]... --reference=RFILE FILE...
OPTIONS：
        ~]# chown mdx bash.sh    （改变属主）
        ~]# chown mdx:user bash.sh  （改变属主是mdx，属组是user）
        ~]# chown --reference reference.sh bash.sh   （参照reference.sh的所有者和组）

        -R, --recursive：递归修改（目录）
            ~]# chown –R root:root rootfs
---------------------------------------------------------------------------------------------
（*）chgrp：变更文件或目录的所属组
SYNOPSIS
       chgrp [OPTION]... GROUP FILE...
       chgrp [OPTION]... --reference=RFILE FILE...
OPTIONS：
        ~]# chgrp user bash.sh （变更bash.sh文件所属组为user）
        ~]# chgrp --reference reference.sh bash.sh （参照reference.sh文件进行所属组修改）

        -R, --recursive：递归（目录）
              ~]# chgrp -R user Public/
---------------------------------------------------------------------------------------------
（*）umask：显示或设定文件模式掩码
            文件：
                666-umask
            目录：
                777-umask
                
            注意：之所以文件用666去减，表示文件默认不能有执行权限；如果减得的结果中，u,g或o有执行权限时，则需要加1；
                
            显示：
                ~]$ umask
                        0002

            设定：
                umask MASK
                    ~]$ umask 0333

            注意：此设定仅对当前shell进程有效
---------------------------------------------------------------------------------------------



二：查看,修改与统计
---------------------------------------------------------------------------------------------
（*）ls：列出指定目录下的内容
SYNOPSIS：
       ls [OPTION]... [FILE]...
DESCRIPTION：
        -a, --all：显示所有文件，包括.和..在内所有隐藏文件； 
        -A, --almost-all
        -l：use a long listing format
            drwxr-xr-x   2 root root   18 2月  29 03:38 account
                drwxr-xr-x：
                    d：文件类型，一个字符；
                    rwxr-xr-x：文件权限，permission；
                        perm：
                            r：readable
                            w：writable
                            x: excutable
                        权限三位一组。
                            左三位：属主的访问权限。
                            中三位：属组的所有用户的访问权限。
                            右三位：其它(other)用户的访问权限。
                    2：数字，表示文件被硬链接的次数。
                    root：一个用户名，表示当前文件的属主(owner)。
                    root：一个组名，表示当前文件属组(group)。
                    18：一个数值，表示当前文件的size，默认单位为字节。
                    2月  29 03:38 ：一个时间，表示文件最近一次被修改的时间。
                    account：文件名；
        -h, --human-readable：对数值做单位换算。
        -d：查看目录自身的属性。
        -R：recursive，递归显示。
        -r：reverse，降序显示。
        --color={never|auto|always}：何时着色显示。
---------------------------------------------------------------------------------------------
（*）pwd：显示工作目录
            ~]$ echo $PWD （等同于 pwd）
                /home/mdx
            ~]$ echo $OLDPWD （上一次的工作目录）
                /home/mdx/man
            ~]$ pwd
                /home/mdx
---------------------------------------------------------------------------------------------
（*）cd：change directory
SYNOPSIS：
        cd: cd [-L|[-P [-e]]] [dir]
DESCRIPTION：
        cd：切换回家目录。
            注意：bash中，~表示用户的家目录。
        cd ~：切换回家目录。
        cd  ~USERNAME：切换至指定用户的家目录。
        cd  -：在上一次所在目录与当前目录之间来回切换。
---------------------------------------------------------------------------------------------
（*）cat：连接并倾倒至输出设备。
SYNOPSIS：
       cut OPTION... [FILE]...
DESCRIPTION：
        -n, --number: 对显示出的行进行编号。
            ~]$ cat -n cd.php

        -E, --show-ends：显示行结束符。
            ~]$ cat -E cd.php

        Ctrl+c：中止当前命令。
---------------------------------------------------------------------------------------------
（*）tac： cat的逆序。
---------------------------------------------------------------------------------------------
（*）file：查看文件内容类型
SYNOPSIS：
     file [-bchiklLNnprsvz0] [--apple] [--mime-encoding] [--mime-type] [-e testname]
          [-F separator] [-f namefile] [-m magicfiles] file ...
     file -C [-m magicfiles]
     file [--help]
OPTIONS：
    ~]$ file bash.sh 
            bash.sh: ASCII text
---------------------------------------------------------------------------------------------
（*）echo：回显命令
SYNOPSIS
       echo [SHORT-OPTION]... [STRING]...
       echo LONG-OPTION
DESCRIPTION：
        -n：不自动附加换行符；
        -e：启用转义符；
            \n：换行
            \b：退格
            \t：水平制表符
            \v：垂直制表符
                        
            数据有其类型：决定了其存储空间、能参与的运算
                ”127“：字符串
                    ASCII text：24bits
                127：数值
                    0111 1111：8bits
                    
            bash是弱类型的编程语言，不严格区分数据类型，意味把所有数据统统当作字符串处理；
                字符串类型的数据可不加引号； 
            引号有三种类型：', ", `
                ', "：字符引用
                    ': 强引用，其内部的变量不会被替换； 
                    "：弱引用，其内部的变量会被替换；
                `：命令引用
                
            变量引用：${NAME}
---------------------------------------------------------------------------------------------
（*）mkdir：创建目录
SYNOPSIS：
       mkdir [OPTION]... DIRECTORY...
DESCRIPTION：
       -m, --mode=MODE：设定目录权限
            ~]$ mkdir -m 755 dir

       -p, --parents：按需创建父目录路径。
            ~]$ mkdir -p a/b/c/d

       -v, --verbose：打印创建目录的信息。
            ~]$ mkdir -v ab
                    mkdir: created directory ‘ab’
            ~]$ mkdir -pv a/b/c
                    mkdir: created directory ‘a’
                    mkdir: created directory ‘a/b’
                    mkdir: created directory ‘a/b/c’
---------------------------------------------------------------------------------------------
（*）rmdir：删除空目录
SYNOPSIS：
       rmdir [OPTION]... DIRECTORY...
DESCRIPTION：
       -p, --parents：删除指定的目录后，如果其父目录为空，则一并删除之
            ~]$ rmdir -p a/b/c

       -v, --verbose：打印过程
            ~]$ rmdir -pv a/b/c/d
                    rmdir: removing directory, ‘a/b/c/d’
                    rmdir: removing directory, ‘a/b/c’
                    rmdir: removing directory, ‘a/b’
                    rmdir: removing directory, ‘a’
---------------------------------------------------------------------------------------------
（*）cp：复制文件或目录
SYNOPSIS：
    单源复制：
       cp [OPTION]... [-T] SOURCE DEST
        注意：
            如果 DEST 不存在（仅指基名所指定的文件不存在）。
                事先创建DEST文件，而后复制源文件的内容导入至目标文件。
            如果 DEST 存在。
                如果 DEST 是目录：则在此目录中创建一个与原文件同名的文件，则导入其内容。
                如果 DEST 是非目录文件：则覆盖目标文件。       
    多源复制：
       cp [OPTION]... SOURCE... DIRECTORY
       cp [OPTION]... -t DIRECTORY SOURCE...
       注意：
            DEST 存在，且必须是目录；否则即为错误。
DESCRIPTION：
        ~]$ cp file.sh a/       （不指定文件名则为默认）
        ~]$ ls a
                file.sh
        ~]$ cp file.sh a/aa.sh      （可以修改文件名）
        ~]$ ls a
                aa.sh

       -i, --interactive：交互式复制，即覆盖目标文件之前提醒用户确认。
            ~]$ cp -i file.sh a/       （没有同名文件不提示）
            ~]$ cp -i file.sh a/        （有同名文件需确认 y 或者 n）
                    cp: overwrite ‘a/file.sh’? y

        -f, --force：强制覆盖目标文件。
            ~]$ cp -f file.sh a/

        -R, -r, --recursive：递归复制目录及其内容。
            ~]$ cp -R man Public/

        -P, --no-dereference：复制链接文件本身，而非默认的复制链接文件指向的源文件的内容。
        --preserve[=ATTR_LIST]。
            指明保留的源文件属性列表。
                默认为mode,ownership,timestamps。
                额外：context, links, xattr, all

        -a, --archive：归档复制
            -dR --preserve=all
            注意：仅管理员可保留属主和属组属性；
---------------------------------------------------------------------------------------------
 （*）mv：剪切 (重命名) 文件或目录
 SYNOPSIS：
       mv [OPTION]... [-T] SOURCE DEST
       mv [OPTION]... SOURCE... DIRECTORY
       mv [OPTION]... -t DIRECTORY SOURCE...
DESCRIPTION：
        -i, --interactive：交互式复制，即覆盖目标文件之前提醒用户确认。
        -f, --force：强制覆盖目标文件。
 ---------------------------------------------------------------------------------------------
 （*）rm：删除文件或目录
SYNOPSIS
       rm [OPTION]... FILE...
OPTIONS
        -i, --interactive：每次删除前提示
        -f, --force：强制删除
        -r, -R, --recursive：递归删除目录及其内容
---------------------------------------------------------------------------------------------
（*）more：CRT查看文件浏览过滤。（和cat的功能一样都是查看文件里的内容，但有所不同的是more可以按页来查看文件的内容，还支持直接跳转行等功能。）
SYNOPSIS：
       more [options] file [...]
OPTIONS：
        +n      从笫n行开始显示
        -n       定义屏幕大小为n行
        +/pattern 在每个档案显示前搜寻该字串（pattern），然后从该字串前两行之后开始显示  
        -c       从顶部清屏，然后显示
        -d       提示“Press space to continue，’q’ to quit（按空格键继续，按q键退出）”，禁用响铃功能
        -l        忽略Ctrl+l（换页）字符
        -p       通过清除窗口而不是滚屏来对文件进行换页，与-c选项相似
        -s       把连续的多个空行显示为一行
        -u       把文件内容中的下画线去掉
COMMANDS：
        Enter    向下n行，需要定义。默认为1行
        Ctrl+F   向下滚动一屏
        空格键  向下滚动一屏
        Ctrl+B  返回上一屏
        =       输出当前行的行号
        ：f     输出文件名和当前行的行号
        V      调用vi编辑器
        !命令   调用Shell，并执行命令 
        q       退出more
---------------------------------------------------------------------------------------------
（*）less：less 与 more 类似，但 less 在查看之前不会加载整个文件。
SYNOPSIS
       less -?
       less --help
       less -V
       less --version
       less [-[+]aABcCdeEfFgGiIJKLmMnNqQrRsSuUVwWX~]
            [-b space] [-h lines] [-j line] [-k keyfile]
            [-{oO} logfile] [-p pattern] [-P prompt] [-t tag]
            [-T tagsfile] [-x tab,...] [-y lines] [-[z] lines]
            [-# shift] [+[+]cmd] [--] [filename]...
       (See the OPTIONS section for alternate option syntax with long option names.)
COMMANDS：
    -b <缓冲区大小> 设置缓冲区的大小
    -e  当文件显示结束后，自动离开
    -f  强迫打开特殊文件，例如外围设备代号、目录和二进制文件
    -g  只标志最后搜索的关键词
    -i  忽略搜索时的大小写
    -m  显示类似more命令的百分比
    -N  显示每行的行号
    -o <文件名> 将less 输出的内容在指定文件中保存起来
    -Q  不使用警告音
    -s  显示连续空行为一行
    -S  行过长时间将超出部分舍弃
    -x <数字> 将“tab”键显示为规定的数字空格
    /字符串：向下搜索“字符串”的功能
    ?字符串：向上搜索“字符串”的功能
    n：重复前一个搜索（与 / 或 ? 有关）
    N：反向重复前一个搜索（与 / 或 ? 有关）
    b  向后翻一页
    d  向后翻半页
    h  显示帮助界面
    Q  退出less 命令
    u  向前滚动半页
    y  向前滚动一行
    空格键 滚动一行
    回车键 滚动一页
    [pagedown]： 向下翻动一页
    [pageup]：   向上翻动一页
---------------------------------------------------------------------------------------------
（*）head：输出文件的前n行
SYNOPSIS：
       head [OPTION]... [FILE]...
DESCRIPTION：
        ~]$ head fstab 

        -n #：显示前n行
        -#：等同于 -n #

        ~]$ head -3 fstab 
---------------------------------------------------------------------------------------------
（*）tail：查看文件的后n行
SYNOPSIS：
       tail [OPTION]... [FILE]...
DESCRIPTION：
        ~]$ tail fstab

        -n #：显示后n行
        -#： 等同于 -n #
        -f：查看文件尾部内容结束后不退出，阻塞在文件上，追加了新内容时，会继续显示。
            ~]$ tail -f fstab

        终止：Ctrl+c
---------------------------------------------------------------------------------------------
（*）stat：显示文件或文件系统状态
SYNOPSIS：
       stat [OPTION]... FILE...
DESCRIPTION：
        文件的数据组成部分：
            元数据（metadata）：存放于文件系统中的inode。
            数据(data)：data blocks。
        文件的三个时间戳：
            access time：atime，文件最近一次被访问的时间。
            modify time：mtime，文件最近一次被修改的时间（数据）。
            change time：ctime，文件最近一次改动的时间（元数据）。

        ~]$ stat fstab 
                  File: ‘fstab’
                  Size: 541         Blocks: 8          IO Block: 4096   regular file
                Device: fd02h/64770d    Inode: 134224909   Links: 1
                Access: (0664/-rw-rw-r--)  Uid: ( 1000/     mdx)   Gid: ( 1000/     mdx)
                Context: unconfined_u:object_r:user_home_t:s0
                Access: 2016-03-13 10:46:24.837003802 +0800
                Modify: 2016-03-13 10:45:50.112004210 +0800
                Change: 2016-03-13 10:45:50.112004210 +0800
                 Birth: -
---------------------------------------------------------------------------------------------
（*）touch：改变文件时间戳
SYNOPSIS：
       touch [OPTION]... FILE...
DESCRIPTION：
      -a：仅修改atime
       -c, --no-create：不创建文件（默认，打开文件不存在就会创建）
            ~]$ touch -c bash.sh
            ~]$ ls

       -m：仅修改mtime
       -t STAMP：使用指定的日期时间。格式：[[CC]YY]MMDDhhmm[.ss] 
---------------------------------------------------------------------------------------------
（*）wc：统计文件行数，单词数和字节数
SYNOPSIS：
       wc [OPTION]... [FILE]...
       wc [OPTION]... --files0-from=F
DESCRIPTION：
        ~]$ wc fstab （默认格式）
             12     60        541   fstab
            行数 单词数 字节数 文件名

       -c, --bytes：字节数
            ~]$ wc -c fstab 
            541 fstab

       -l, --lines：行数
            ~]$ wc -l fstab 
            12 fstab

       -w, --words：单词数
            ~]$ wc -w fstab 
            60 fstab

        统计文数量但不输出文件名：
            cat fstab |wc -l（-w，-c）
---------------------------------------------------------------------------------------------
（*）cut：从每行文件中删除部分，（分隔符）
SYNOPSIS：
       cut OPTION... [FILE]...
DESCRIPTION：
       -d, --delimiter=DELIM：以指定的字符为输入分隔符；默认为空白字符。

       -f, --fields=LIST
                #：指定的单个字段；
                #,#：离散的多个字段；例如1,3,7；
                #-#：连续的多个字段，例如4-7；
            ~]$ echo "a/b/c" |cut -d '/' -f 1

        --output-delimiter=STRING ：输出分隔符。
---------------------------------------------------------------------------------------------
（*）sort：文本文件排序
SYNOPSIS：
       sort [OPTION]... [FILE]...
       sort [OPTION]... --files0-from=F
DESCRIPTION：
        -r, --reverse：逆序排序。
        -u, --unique：相同的行只保留一次；连续且完全一样方为相同。
        -t CHAR：指定分隔符。
        -k #：用于做排序的字段。
        -n, --numeric-sort：基于数值大小进行比较。
        -f, --ignore-case：比较时忽略字符大小写。
---------------------------------------------------------------------------------------------
（*）uniq：重复报告或省略
SYNOPSIS：
       uniq [OPTION]... [INPUT [OUTPUT]]
DESCRIPTION：
        -d, --repeated：仅显示重复的行。
            ~]$ uniq -d fstab
        -u, --unique：仅显示不曾重复的行。
            ~]$ uniq -u fstab
        -c, --count：在每行的行首显示其出现的次数。
            ~]$ uniq -u fstab
---------------------------------------------------------------------------------------------
（*）diff：比较文件行
SYNOPSIS：
       diff [OPTION]... FILES
DESCRIPTION：
        -u, -U NUM, --unified[=NUM]：使用unified机制，即显示要修改的行上下文，默认为3行。
---------------------------------------------------------------------------------------------
（*）patch：应用更改文件（补丁）
SYNOPSIS：
       patch [-blNR][ -c| -e| -n][-d dir][-D define][-i patchfile]
               [-o outfile][-p num][-r rejectfile][file]
DESCRIPTION：
        -i /PATH/FROM/PATCH_FILE：指明补丁文件路径。
        -R  or  --reverse：还原。
---------------------------------------------------------------------------------------------
（*）install：复制文件和设置属性
SYNOPSIS：
       install [OPTION]... [-T] SOURCE DEST
       install [OPTION]... SOURCE... DIRECTORY
       install [OPTION]... -t DIRECTORY SOURCE...
       install [OPTION]... -d DIRECTORY...
DESCRIPTION：
        -o OWNER：指定属主。
        -g  GROUP：指定属组。
        -m MODE: 指定权限。
---------------------------------------------------------------------------------------------
（*）mktemp：创建临时文件或目录
SYNOPSIS：
       mktemp [OPTION]... [TEMPLATE]
DESCRIPTION：
        模板文件名：filename.XXX
            至少三个X；
            
        使用方式：用变量保存生成的文件路径；
            myfile=$(mktemp /tmp/myfile.XXXX)
            
        常用选项：
            -d：创建临时目录而非文件；
            -p DIR, --tmpdir[=DIR]：设定临时文件所在的目录；默认为当前目录，或为TMPDIR环境变量设定的路径；

---------------------------------------------------------------------------------------------
（*）find：递归搜索文件
SYNOPSIS：
       find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression]
OPTIONS：
    根据文件名查找：
        -name "文件名称"：支持使用glob（ *, ?, [], [^] ）
            ~]# find ./ -name "*.xz" -exec rm -rf {} \;  #删除以.xz结尾的文件

        -iname "文件名称"：不区分字母大小写
        -regex "PATTERN"：以PATTERN匹配整个文件路径字符串，而不仅仅是文件名称；
        -maxdepth #：指定find搜索目录深度，
            ~]# find ./ -maxdepth 1 -name "*.xz" -delete

    根据属主、属组查找：
        -user USERNAME：查找属主为指定用户的文件。
        group GRPNAME: 查找属组为指定组的文件。
        -uid UserID：查找属主为指定的UID号的文件。
        -gid GroupID：查找属组为指定的GID号的文件。
        -nouser：查找没有属主的文件。
        -nogroup：查找没有属组的文件。

    根据文件类型查找：
        -type TYPE:
            f: 普通文件
            d: 目录文件
            l: 符号链接文件
            s：套接字文件
            b: 块设备文件
            c: 字符设备文件
            p: 管道文件

    组合条件：
        与：-a
        或：-o
        非：-not, !

        示例：
            !A -a !B = !(A -o B)
            !A -o !B = !(A -a B)
            ~]# find /tmp \( -not -user root -a -not -name 'fstab' \) -ls
            ~]# find /tmp -not \( -user root -o -name 'fstab' \) -ls

    根据文件大小来查找：
        -size [+|-]#UNIT
            常用单位：k, M, G
            #UNIT: (#-1, #]
            -#UNIT：[0,#-1]
            +#UNIT：(#,oo)

    根据时间戳：
        以“天”为单位；
            -atime [+|-]#,  
                #: [#,#+1)
                +#: [#+1,oo]
                -#: [0,#)
            -mtime
            -ctime
        以“分钟”为单位：
            -amin：访问时间
            -mmin：元数据修改时间
            -cmin：数据修改时间

    根据权限查找：
        -perm [/|-]MODE
            MODE: 精确权限匹配
            /MODE：任何一类(u,g,o)对象的权限中只要能一位匹配即可。
            -MODE：每一类对象都必须同时拥有为其指定的权限标准。

    处理动作：
        -print：默认的处理动作，显示至屏幕；
        -ls：类似于对查找到的文件执行“ls -l”命令；
        -delete：删除查找到的文件；
        -fls /path/to/somefile：查找到的所有文件的长格式信息保存至指定文件中；
        -ok COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令；
            对于每个文件执行命令之前，都会交互式要求用户确认；
        -exec COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令; 
            {}: 用于引用查找到的文件名称自身；

组合其它命令：
        xargs：find传递查找到的文件至后面指定的命令时，参数过多时有可能失败。
                    用法：find | xargs COMMAND 
                    ~]# find / -name "core" -print | xargs echo "" >/tmp/core.log
                    ~]# find ./ -type f | xargs  grep "string"